package cn.comon.app.scan.analysis;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;
import java.util.TreeSet;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.apache.log4j.Logger;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
import cn.comon.app.scan.entity.AsReportinfo;
import cn.comon.app.scan.util.UtilTools;

/**
 * 金山软件检测接口
 * @author xujf
 *
 */
@Service("dubaAnalysis")
@Scope("prototype")
@Lazy(value=true)
public class DubaAnalysis implements IAnalysisMSG{
    private static Logger logger = Logger.getLogger(DubaAnalysis.class.getName());

    public Object getSendData(Properties params, Object asReportinfo) {
        logger.info(this.getClass().getName() + "Method getSendData");
        try {
            // 金山接口数据
            JSONObject sendData = new JSONObject();
            AsReportinfo asReportinfoTMP = (AsReportinfo)asReportinfo;

            //要扫描的文件列表,内容为具体的文件信息json字符串
            JSONArray list = new JSONArray();
            JSONObject appData = new JSONObject();
            appData.put("md5", asReportinfoTMP.getFileMd5());
            appData.put("url", asReportinfoTMP.getPackageUrl());
            //要扫描的文件的标识(结果回调时一并返回)
            appData.put("flag", asReportinfoTMP.getId());
            list.add(appData);

            //构造json字符串
            //priority:要此批文件的优先级。 0为普通优先级，1为高优先级。
            String scanParam = list.toString();
            scanParam = "{\"scanlist\":[" + "{" + scanParam + "}],"
                       + "\"priority\":\"" + params.getProperty("duba.priority") + "\"}";
            String post = "request=" + scanParam;
            sendData.put("postData", post);
            logger.info("the value of post && request from kingsoftDUBA:" + post);
            //签名算法:
            //step1: 将所有输入参数（包括GET和POST参数，但除sign参数外）格式化为"key=value"格式，
                     //如"k1=v1"、"k2=v2"、 "k3=v3"；
            //step2: 将格式化好的参数键值对以字典序升序方式排列后，拼接在一起，如"k1=v1k2=v2k3=v3"；
            //step3: 在拼接好的字符串末尾拼接上我们为金山提供的secure_key，并对获取到的字符串算MD5签名，
                     //签名值即为sign参数的值。
            Map<String, String> map = new HashMap<String, String>();
            map.put("v", params.getProperty("duba.version"));
            map.put("tpl", params.getProperty("duba.tpl"));
            map.put("request", scanParam);
            //升序方式排序
            TreeSet<String> ts = new TreeSet<String>();
            ts.add("v");
            ts.add("tpl");
            ts.add("request");
            Iterator<String> iterator=ts.iterator();  
            //迭代器   
            //迭代器   
            String sign="";
            while(iterator.hasNext()) {
                String strTMP = iterator.next();
                sign = sign + strTMP + "="+ map.get(strTMP);
            }
            sign = sign + params.getProperty("duba.secureKey");
            logger.info("the value of sign from kingsoftDUBA:" + sign);
            sign = UtilTools.getStringMd5(sign);
            logger.info("the value of signMD5 from kingsoftDUBA:" + sign);

            // 构造接口访问地址
            String sendUrl = null;
            StringBuffer sendUrlBf = new StringBuffer();
            sendUrlBf.append(params.getProperty("duba.url"));
            //接口版本号。
            sendUrlBf.append("?v=");
            sendUrlBf.append(params.getProperty("duba.version"));
            //合作方标识，由金山分配给合作方。
            sendUrlBf.append("&tpl=");
            sendUrlBf.append(params.getProperty("duba.tpl"));
            //签名, 用来校验数据的完整性，以及防止冒充数据
            sendUrlBf.append("&sign=");
            sendUrlBf.append(sign);

            //请求地址设定
            sendUrl = sendUrlBf.toString();
            sendData.put("sendUrl", sendUrl);
            logger.info("the value of sendUrl from kingsoftDUBA:" + sendUrl);
            
            return sendData;
       } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}